#include <STC15F2K60S2.H>
#include <stdio.h>
#include <string.h>
#include "ESP8266.h"
#include "ESP8266_Uart2.h"

//P1^0:接ESP8266的TX
//P1^1:接ESP8266的RX
unsigned char xdata Property_Data[2];		//数据保存数组

//专用延时函数1ms，可改用STC——ISP的延迟代码
void ESP8266_delay_ms(unsigned int nms)
{
    unsigned char xdata cnt=125;
    unsigned char xdata i,j;
    for(i=0;i<nms;i++)
        for(j=0;j<cnt;j++);
}//这里我们经验值给定是125个for循环为1ms

/*****************************************************
*函数名称：ESP8266_Re(char *ACK_AT)
*函数功能：对应答信号进行解析
*入口参数：void
*出口参数：0：应答失败
					1：应答成功
*****************************************************/
unsigned char ESP8266_Re(char *ACK_AT)
{		
	unsigned char xdata *ret = 0;
	unsigned char xdata i;
	ESP8266_delay_ms(200);
	if(ACK_AT == NULL)
	{
		return 0;
	}
	else
	{
		ret = ESP8266_Rx_Data;
//		if(ret != 0)
//		{
			//返回值为char * 类型（ 返回指向 str1 (ret)中第一次出现的 str2 (ACK_AT)的指针）
			//如果 str2 不是 str1 的一部分，则返回空指针
			if(strstr((const char *)ret,(const char *)ACK_AT) != NULL)
			{	
				for(i=0;i<ESP8266_len;i++)
				{
					ESP8266_Rx_Data[i]=0;
				}
				//memset(ESP8266_Rx_Data,0,ESP8266_len);	//第二种方法
				ESP8266_len = 0;
				return 1;
			}
			else
			{
				for(i=0;i<ESP8266_len;i++)
				{
					ESP8266_Rx_Data[i]=0;
				}
				ESP8266_len = 0;
				return 0;
			}			
//		}
//		else
//		{
//			ESP8266_len = 0;
//			return 0;
//		}		
	}
}

/*****************************************************
*函数名称：ESP8266_Send(char *property,int Data)
*函数功能：向云端发送数据
*入口参数：char *property,int Data （属性）（数据）
*出口参数：void
*****************************************************/
//void ESP8266_Send(char *property,int Data)
//{
//	printf("AT+MQTTPUB=0,\"%s\",\"{\\\"%s\\\":%d}\",1,0\r\n",post,property,Data);
//}
//灯的开关：int Switch (0~1)	
//灯的色温,黄的占比：int Temp (0~100)  
//灯的亮度：int Value (0~100)	
//类型可改，记得%d也要改
void ESP8266_Send_LightSwitch(int Switch)
{
	printf("AT+MQTTPUB=0,\"%s\",\"{\\\"LightSwitch\\\":%d}\",1,0\r\n",post,Switch);
}
void ESP8266_Send_LightTemp(int Temp)
{
	printf("AT+MQTTPUB=0,\"%s\",\"{\\\"LightTemp\\\":%d}\",1,0\r\n",post,Temp);
}
void ESP8266_Send_LightValue(int Value)
{
	printf("AT+MQTTPUB=0,\"%s\",\"{\\\"LightValue\\\":%d}\",1,0\r\n",post,Value);
}
void ESP8266_Send_all(int Switch,int Temp,int Value)
{
	printf("AT+MQTTPUB=0,\"%s\",\"{\\\"LightSwitch\\\":%d\\\,\\\"LightTemp\\\":%d\\\,\\\"LightValue\\\":%d}\",1,0\r\n",post,Switch,Temp,Value);
}

/*****************************************************
*函数名称：ESP8266_Received(void)
*函数功能：云端接收数据
*入口参数：char *property,int Data （属性）（数据）
*出口参数：void
*****************************************************/
char ESP8266_Rec_Number(char *beibijiao)
{
	unsigned char *ptr;	//'}'在字符串中的位置
	int weishu = 0;
	ptr = strchr((const char *)beibijiao, '}');
	//strchr() 用于查找字符串中的一个字符，并返回该字符在字符串中第一次出现的位置。
	//char *strchr(const char *str, int c)
	if(ptr != NULL)
	{
//	weishu = ptr - number + 1;  
		weishu = ptr - beibijiao;	//S":1}、T":10}、V":100} 中}的位置4、5、6
		if(weishu == 4)
		{
			return (*(beibijiao+3)-'0');
		}
		else if(weishu == 5)
		{
			return (*(beibijiao+3)-'0')*10+(*(beibijiao+4)-'0');
		}
		else if(weishu == 6)
		{
			return 100;
		}
	}
	return 111;
}
int ESP8266_Received()	//Light
{
	unsigned char *ret = 0;
	char *property_S = 0,*property_T = 0,*property_V = 0;
	
	char number,mode_flag;		
	int Light = 0;		
	//合成的值，高八位是标志位（mode_flag 0:错误；1：开关；2：色温；3：亮度）
	//低八位是对应的数值number
	ret = ESP8266_Rx_Data;
//	if(ret != 0)
//	{
//		UART1_SendString(ESP8266_Rx_Data);		//不要这个，后面的都不行？
		property_S = strstr((const char *)ret,"S\":");
		property_T = strstr((const char *)ret,"T\":");
		property_V = strstr((const char *)ret,"V\":");
		if(property_S != NULL)
		{
//			UART1_SendString(property_S);
			mode_flag = 1;
			number = ESP8266_Rec_Number(property_S);
			if(number != 111)
			{
				Light = (mode_flag << 8) | number;
//				UART1_SendByte((LightSwitch/100) + '0');
//				UART1_SendByte((LightSwitch/10%10) + '0');
//				UART1_SendByte((LightSwitch%10) + '0');
			}
			memset(ESP8266_Rx_Data,0,128);
			ESP8266_len = 0;
			return Light;
		}
		else if(property_T != NULL)
		{
//			UART1_SendString(property_T);
			mode_flag = 2;
			number = ESP8266_Rec_Number(property_T);
			if(number != 111)
			{
				Light = (mode_flag << 8) | number;
//				UART1_SendByte((LightTemp/100) + '0');
//				UART1_SendByte((LightTemp/10%10) + '0');
//				UART1_SendByte((LightTemp%10) + '0');
			}
			memset(ESP8266_Rx_Data,0,128);
			ESP8266_len = 0;
			return Light;
		}
		else if(property_V!=NULL)
		{
//			UART1_SendString(property_V);
			mode_flag = 3;
			number = ESP8266_Rec_Number(property_V);
			if(number != 111)
			{
				Light = (mode_flag << 8) | number;
//				UART1_SendByte((LightValue/100) + '0');
//				UART1_SendByte((LightValue/10%10) + '0');
//				UART1_SendByte((LightValue%10) + '0');
			}
			memset(ESP8266_Rx_Data,0,128);
			ESP8266_len = 0;
			return Light;
		}
		else
		{
			memset(ESP8266_Rx_Data,0,128);
			ESP8266_len = 0;
		}
//	}
//	else
//	{
//		memset(ESP8266_Rx_Data,0,128);
//		ESP8266_len = 0;	
//	}
	return Light;
}

/*****************************************************
*函数名称：void ESP8266_Init(void)
*函数功能：ESP8266参数初始化
*入口参数：void
*出口参数：void
*****************************************************/
void ESP8266_Init(void)
{
	printf("AT+RST\r\n");		
	
	printf("AT+CWMODE=1\r\n");	//配置WiFi工作模式为Station模式:就是ESP8266模块去连接自己家的wifi,
															//手机也连接自己家的wifi然后实现了手机和WiFi模块的通信,(自己家wifi相当于一个中介)
	while(ESP8266_Re("OK")==0)
	{
		printf("AT+CWMODE=1\r\n");//返回值是否为OK
	}
	//UART1_SendString("模式设置成功");
	//UART1_SendString("模式设置成功");可以改用其他串口来发送成功信息
	//注意wife不要修改成自己的，开热点名字看ESP8266.h的WIFI_Name,WIFI_Pass
	
	printf("AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI_Name,WIFI_Pass);
	ESP8266_delay_ms(200);
	while(ESP8266_Re("OK")==0)
	{
		printf("AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI_Name,WIFI_Pass);
	}
	//UART1_SendString("WIFI已连接");
	
	printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\"\,\"%s\"\,0,0,\"\"\r\n",username,passwd);		//AT+MQTTUSERCFG - 配置 MQTT 用户属性
	while(ESP8266_Re("OK")==0)
	{
		printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\",\"%s\",0,0,\"\"\r\n",username,passwd);//返回值是否为OK
	}
	//UART1_SendString("MQTT配置成功\r\n");
	
	printf("AT+MQTTCLIENTID=0,\"%s\"\r\n",clientId);		//配置 MQTT 客户端 ID
	while(ESP8266_Re("OK")==0)
	{	
		printf("AT+MQTTCLIENTID=0,\"%s\"\r\n",clientId);//返回值是否为OK
	}
	//UART1_SendString("客户端配置成功\r\n");
	
	printf("AT+MQTTCONN=0,\"%s\",%s,1\r\n",mqttHostUrl,port);	//连接指定 MQTT协议
	while(ESP8266_Re("OK")==0)
	{
		printf("AT+MQTTCONN=0,\"%s\",%s,1\r\n",mqttHostUrl,port);//返回值是否为OK
	}
	//UART1_SendString("MQTT协议配置成功\r\n");
}